function log(target) {
    console.log(111);
    target.isTestable = true;
}

function timeCalc(target, name, descriptor) {
    console.log('@timeCalc :: ', Date.now());
    console.log(target, name, descriptor);
    const oldValue = descriptor.value;

    descriptor.value = async function () {
        console.log('@timeCalc --> ', Date.now());
        console.time(name);
        const ret = await oldValue.apply(this, arguments);
        console.timeEnd(name);
        console.log('@timeCalc <-- ', Date.now());
        return ret;
    };
    return descriptor;
}

class Dog {
    // @timeCalc
    @log
    hello() {
        console.log('hello');
    }
}
